﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using SoftwareConsulting.BI11.Studio.Core.Project;
using SoftwareConsulting.BI11.Studio.InternalServices;

namespace SoftwareConsulting.BI11.Studio.UI.ProjectExplorer
{
    /// <summary>
    /// Класс настроек проекта
    /// </summary>
    public class ProjectSettings
    {
        #region поля
        private HashSet<Guid> _projectExplorerTreeExpanded; //состояния раскрытия контейнерных объектов в дереве контейнерных объектов
        private Guid _projectExplorerObjectsTreeSelectedContainerId; //идентификатор выбранного контейнерного объекта в дереве объектов обозревателя проекта
        private ProjectDescriptor _projectLink; //для связи с проектом
        #endregion

        #region публичные свойства        
        /// <summary>
        /// Возвращает/устанавливает состояния раскрытия контейнерных объектов в дереве контейнерных объектов
        /// </summary>
        public HashSet<Guid> ProjectExplorerTreeExpanded
        {
            get
            {
                return _projectExplorerTreeExpanded;
            }
            set
            {
                _projectExplorerTreeExpanded = value;
            }
        }
        
        /// <summary>
        /// Возвращает/устанавливает идентификатор выбранного контейнерного объекта в дереве объектов обозревателя проекта
        /// </summary>
        public Guid ProjectExplorerObjectsTreeSelectedContainerId
        {
            get
            {
                return _projectExplorerObjectsTreeSelectedContainerId;
            }
            set
            {
                _projectExplorerObjectsTreeSelectedContainerId = value;
            }
        }                
        #endregion

        #region внутренние свойства
        /// <summary>
        /// Возвращает идентификаторы раскрытых контейнеров в дереве контейнерных объектов Обозревателя Проекта
        /// </summary>
        private string ExpandedContainersIds
        {
            get
            {
                string result = string.Empty;
                foreach (Guid id in ProjectExplorerTreeExpanded)
                {
                    result += id.ToString() + ';';
                }
                if (result.Length > 0)
                    result = result.Substring(0, result.Length - 1);
                return result;
            }
        }
        #endregion

        #region внутренние методы
        /// <summary>
        /// Возвращает идентификаторы раскрытых контейнерных объектов в Обозревателе Проекта по строке из реестра
        /// </summary>
        /// <param name="registryString"></param>
        /// <returns></returns>
        public HashSet<Guid> GetExpandedContainersListByString(string registryString)
        {
            HashSet<Guid> result = new HashSet<Guid>();
            string[] ids = registryString.Split(';');
            for (int i = 0; i < ids.Length; i++)
            {
                Guid id;
                if (Guid.TryParse(ids[i],out id))
                    result.Add(id);
            }          
            return result;
        }
        #endregion

        #region публичные методы
        /// <summary>
        /// Сохранение настроек в реестре
        /// </summary>        
        public void SaveMe()
        {
            RegistryKey saveKey = Registry.CurrentUser.CreateSubKey("Software\\SoftwareConsulting\\BI-11\\Projects\\" + _projectLink.Name);
            saveKey.SetValue("objectsTreeSelectedContainer", ProjectExplorerObjectsTreeSelectedContainerId.ToString(), RegistryValueKind.String);
            saveKey.SetValue("objectsTreeExpanded", ExpandedContainersIds, RegistryValueKind.String);
            saveKey.Close();
        }

        /// <summary>
        /// Восстановление настроек из реестра
        /// </summary>        
        public void RestoreMe()
        {
            object rec = null;
            RegistryKey readKey = Registry.CurrentUser.OpenSubKey("Software\\SoftwareConsulting\\BI-11\\Projects\\" + _projectLink.Name);
            if (readKey != null)
            {                
                rec = readKey.GetValue("objectsTreeSelectedContainer");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectsTreeSelectedContainerId = Guid.Parse(rec as string);
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("objectsTreeExpanded");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerTreeExpanded = GetExpandedContainersListByString((string)rec);
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                readKey.Close();
            }
        }
        #endregion   
   
        #region конструкторы и финализаторы
        /// <summary>
        /// Конструктор класса
        /// </summary>
        public ProjectSettings(ProjectDescriptor projectLink)
        {
            _projectLink = projectLink;
            _projectExplorerObjectsTreeSelectedContainerId = Guid.Empty;
            _projectExplorerTreeExpanded = new HashSet<Guid>();
        }               
        #endregion
    }
}
